package com.justgame.project.mq.config;

import com.alibaba.fastjson.JSONObject;
import com.justgame.project.cloud.base.abs.AbstractSmsHandler;
import com.justgame.project.cloud.base.properties.TencentCredentialProperties;
import com.justgame.project.cloud.common.util.AppContextUtils;
import com.justgame.project.cloud.common.util.MapBuilder;
import lombok.Getter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.util.Assert;
import org.springframework.web.client.RestTemplate;
import com.tencentcloudapi.common.Credential;
import com.tencentcloudapi.common.profile.ClientProfile;
import com.tencentcloudapi.common.profile.HttpProfile;
import com.tencentcloudapi.common.exception.TencentCloudSDKException;
import com.tencentcloudapi.sms.v20210111.SmsClient;
import com.tencentcloudapi.sms.v20210111.models.*;

import java.util.HashSet;
import java.util.List;
import java.util.Map;

/**
 * 腾讯短信服务配置
 */
@Configuration
@ConditionalOnProperty(prefix = "sms",name = "provider",havingValue = "tencent")
public class TencentSmsTemplateConfig implements AbstractSmsHandler.ISmsTemplate {
    @Value("${sms.app-id}")
    private String appId;

    @Value("${sms.url}")
    private String url;

    @Getter
    @Value("${sms.sms-template-id}")
    private String authTemplateId;

    @Autowired
    private TencentCredentialProperties tencentCredentialProperties;

    @Bean
    public Credential credential(){
        return new Credential(tencentCredentialProperties.getSecretId(),tencentCredentialProperties.getSecretKey());
    }

    /**
     * 短信授权验证
     */
    @Primary
    @Bean("authPhoneSmsProperties")
    public AbstractSmsHandler authPhoneSmsProperties(){
        return new AbstractSmsHandler(appId,authTemplateId,url) {
            @Override
            protected void beforeSendSMS() {
                Assert.hasLength(appId,"未配置短信服务appId");
                Assert.hasLength(templateId,"未配置短信服务templateId");
                Assert.hasLength(url,"未配置短信服务请求地址");
            }

            @Override
            protected boolean sendSMS(String phoneNumber,String[] params){
                // 实例化一个认证对象，入参需要传入腾讯云账户 SecretId 和 SecretKey，此处还需注意密钥对的保密
                // 代码泄露可能会导致 SecretId 和 SecretKey 泄露，并威胁账号下所有资源的安全性。以下代码示例仅供参考，建议采用更安全的方式来使用密钥，请参见：https://cloud.tencent.com/document/product/1278/85305
                // 密钥可前往官网控制台 https://console.cloud.tencent.com/cam/capi 进行获取
                Credential cred = credential();
                // 实例化一个http选项，可选的，没有特殊需求可以跳过
                HttpProfile httpProfile = new HttpProfile();
                httpProfile.setEndpoint(url);
                // 实例化一个client选项，可选的，没有特殊需求可以跳过
                ClientProfile clientProfile = new ClientProfile();
                clientProfile.setHttpProfile(httpProfile);
                // 实例化要请求产品的client对象,clientProfile是可选的
                SmsClient client = new SmsClient(cred, "ap-beijing", clientProfile);
                // 实例化一个请求对象,每个接口都会对应一个request对象
                SendSmsRequest req = new SendSmsRequest();
                req.setSmsSdkAppId(appId);
                req.setTemplateId(templateId);
                req.setSignName("数据涡轮公众号");
                req.setPhoneNumberSet(new String[]{phoneNumber});
                req.setTemplateParamSet(params);
                // 返回的resp是一个SendSmsResponse的实例，与请求对象对应
                try {
                    SendSmsResponse resp = client.SendSms(req);
                    return true;
                } catch (TencentCloudSDKException e) {
                    e.printStackTrace();
                }
                return true;
            }

            @Override
            protected void afterSendSMS() {}
        };
    }
}
